// import 'package:math_keyboard/src/foundation/node.dart';
// import 'package:math_keyboard/src/foundation/extended_nodes.dart';
// import 'package:math_keyboard/src/widgets/math_field.dart';
//
// /// Handler for managing subscript and superscript operations.
// class SubscriptSuperscriptHandler {
//   /// Adds a subscript to the current position in the controller.
//   static void addSubscript(MathFieldEditingController controller) {
//     final currentNode = controller.currentNode;
//
//     // Check if we're at the end of the current node and there's a previous element
//     if (currentNode.courserPosition > 0) {
//       final previousElement =
//           currentNode.children[currentNode.courserPosition - 1];
//
//       // If the previous element is already a subscript/superscript combination
//       if (previousElement is TeXSubscriptSuperscript) {
//         if (!previousElement.hasSubscript) {
//           // Add subscript to existing superscript
//           _addSubscriptToExisting(controller, previousElement);
//           return;
//         }
//       }
//       // If the previous element is a regular function with superscript
//       else if (previousElement is TeXFunction &&
//           previousElement.expression == '^') {
//         // Convert to combined subscript/superscript
//         _convertToSubscriptSuperscript(controller, previousElement, true);
//         return;
//       }
//     }
//
//     // Create new subscript
//     _createNewSubscript(controller);
//   }
//
//   /// Adds a superscript to the current position in the controller.
//   static void addSuperscript(MathFieldEditingController controller) {
//     final currentNode = controller.currentNode;
//
//     // Check if we're at the end of the current node and there's a previous element
//     if (currentNode.courserPosition > 0) {
//       final previousElement =
//           currentNode.children[currentNode.courserPosition - 1];
//
//       // If the previous element is already a subscript/superscript combination
//       if (previousElement is TeXSubscriptSuperscript) {
//         if (!previousElement.hasSuperscript) {
//           // Add superscript to existing subscript
//           _addSuperscriptToExisting(controller, previousElement);
//           return;
//         }
//       }
//       // If the previous element is a regular function with subscript
//       else if (previousElement is TeXFunction &&
//           previousElement.expression == '_') {
//         // Convert to combined subscript/superscript
//         _convertToSubscriptSuperscript(controller, previousElement, false);
//         return;
//       }
//     }
//
//     // Create new superscript
//     _createNewSuperscript(controller);
//   }
//
//   /// Creates a combined subscript/superscript structure.
//   static TeXSubscriptSuperscript createCombined(
//     TeXNode base,
//     TeXNode? subscript,
//     TeXNode? superscript,
//     TeXNode parent,
//   ) {
//     return TeXSubscriptSuperscript(
//       parent,
//       base,
//       subscriptNode: subscript,
//       superscriptNode: superscript,
//     );
//   }
//
//   // Private helper methods
//
//   static void _addSubscriptToExisting(
//     MathFieldEditingController controller,
//     TeXSubscriptSuperscript existing,
//   ) {
//     // Create new combined structure with subscript added
//     final newCombined = TeXSubscriptSuperscript(
//       existing.parent,
//       existing.baseNode,
//       subscriptNode: TeXNode(null),
//       superscriptNode: existing.superscriptNode,
//     );
//
//     // Replace the existing element
//     final currentNode = controller.currentNode;
//     final index = currentNode.courserPosition - 1;
//     currentNode.children[index] = newCombined;
//
//     // Move cursor to the new subscript
//     controller.currentNode = newCombined.subscriptNode!;
//     controller.currentNode.courserPosition = 0;
//     controller.currentNode.setCursor();
//   }
//
//   static void _addSuperscriptToExisting(
//     MathFieldEditingController controller,
//     TeXSubscriptSuperscript existing,
//   ) {
//     // Create new combined structure with superscript added
//     final newCombined = TeXSubscriptSuperscript(
//       existing.parent,
//       existing.baseNode,
//       subscriptNode: existing.subscriptNode,
//       superscriptNode: TeXNode(null),
//     );
//
//     // Replace the existing element
//     final currentNode = controller.currentNode;
//     final index = currentNode.courserPosition - 1;
//     currentNode.children[index] = newCombined;
//
//     // Move cursor to the new superscript
//     controller.currentNode = newCombined.superscriptNode!;
//     controller.currentNode.courserPosition = 0;
//     controller.currentNode.setCursor();
//   }
//
//   static void _convertToSubscriptSuperscript(
//     MathFieldEditingController controller,
//     TeXFunction existing,
//     bool addingSubscript,
//   ) {
//     // Extract the base from the current node (everything before the existing function)
//     final currentNode = controller.currentNode;
//     final index = currentNode.courserPosition - 1;
//
//     // Create base node from previous elements
//     final baseNode = TeXNode(null);
//     if (index > 0) {
//       // Take the element before the existing function as base
//       final baseElement = currentNode.children[index - 1];
//       currentNode.children.removeAt(index - 1);
//       baseNode.children.add(baseElement);
//     }
//
//     // Create the combined structure
//     final combined = TeXSubscriptSuperscript(
//       currentNode,
//       baseNode,
//       subscriptNode: addingSubscript ? TeXNode(null) : existing.argNodes.first,
//       superscriptNode:
//           addingSubscript ? existing.argNodes.first : TeXNode(null),
//     );
//
//     // Replace the existing function
//     currentNode.children[index - 1] = combined;
//
//     // Move cursor to the appropriate node
//     if (addingSubscript) {
//       controller.currentNode = combined.subscriptNode!;
//     } else {
//       controller.currentNode = combined.superscriptNode!;
//     }
//     controller.currentNode.courserPosition = 0;
//     controller.currentNode.setCursor();
//   }
//
//   static void _createNewSubscript(MathFieldEditingController controller) {
//     final currentNode = controller.currentNode;
//
//     // Create base node from the previous element if it exists
//     TeXNode baseNode = TeXNode(null);
//     if (currentNode.courserPosition > 0) {
//       final baseElement = currentNode.children[currentNode.courserPosition - 1];
//       currentNode.children.removeAt(currentNode.courserPosition - 1);
//       currentNode.courserPosition--;
//       baseNode.children.add(baseElement);
//     }
//
//     // Create subscript structure
//     final subscript = TeXSubscriptSuperscript(
//       currentNode,
//       baseNode,
//       subscriptNode: TeXNode(null),
//     );
//
//     // Add to current node
//     currentNode.removeCursor();
//     currentNode.addTeX(subscript);
//
//     // Move cursor to subscript
//     controller.currentNode = subscript.subscriptNode!;
//     controller.currentNode.courserPosition = 0;
//     controller.currentNode.setCursor();
//   }
//
//   static void _createNewSuperscript(MathFieldEditingController controller) {
//     final currentNode = controller.currentNode;
//
//     // Create base node from the previous element if it exists
//     TeXNode baseNode = TeXNode(null);
//     if (currentNode.courserPosition > 0) {
//       final baseElement = currentNode.children[currentNode.courserPosition - 1];
//       currentNode.children.removeAt(currentNode.courserPosition - 1);
//       currentNode.courserPosition--;
//       baseNode.children.add(baseElement);
//     }
//
//     // Create superscript structure
//     final superscript = TeXSubscriptSuperscript(
//       currentNode,
//       baseNode,
//       superscriptNode: TeXNode(null),
//     );
//
//     // Add to current node
//     currentNode.removeCursor();
//     currentNode.addTeX(superscript);
//
//     // Move cursor to superscript
//     controller.currentNode = superscript.superscriptNode!;
//     controller.currentNode.courserPosition = 0;
//     controller.currentNode.setCursor();
//   }
// }
